// 体会 Node.js 的 callback hell 之美
// 学习使用 eventproxy 这一利器控制并发

var eventproxy = require('eventproxy');
var superagent = require('superagent');
var cheerio = require('cheerio');
// url 模块是 Node.js 标准库里面的
// http://nodejs.org/api/url.html
var url = require('url');

var cnodeUrl = 'https://cnodejs.org/'

superagent.get(cnodeUrl)
    .end((err, res) => {
        if (err) return console.error(err);

        var topicUrls = [];
        var $ = cheerio.load(res.text);
        $('#topic_list .topic_title').each((idx, element) => {
            var $element = $(element);
            var href = url.resolve(cnodeUrl, $element.attr("href"));
            topicUrls.push(href);
        });

        // console.log(topicUrls);

        // 得到一个 eventproxy 的实例
        var ep = new eventproxy();
        // 命令 ep 重复监听 topicUrls.length 次（在这里也就是 40 次） `topic_html` 事件再行动
        ep.after("topic_html", topicUrls.length, (topics) => {
            // topics 是个数组，包含了 40 次 ep.emit('topic_html', pair) 中的那 40 个 pair

            // 开始行动
            topics = topics.map((topicPair) => {
                // 接下来都是 jquery 的用法了
                var topicUrl = topicPair[0];
                var topicHtml = topicPair[1];
                var $ = cheerio.load(topicHtml);
                return ({
                    title: $('.topic_full_title').text().trim(),
                    href: topicUrl,
                    comment1: $('.reply_content').eq(0).text().trim(),
                });
            });

            console.log('final:');
            console.log(topics);

        });

        topicUrls.forEach((topicUrl) => {

            superagent.get(topicUrl)
                .end((err, res) => {
                    console.log('fetch ' + topicUrl + ' successful');
                    ep.emit('topic_html', [topicUrl, res.text]);
                });
        });

    });



